// 轮询分发请求-单独实现
const http = require('http');
const os = require('os');
const { fork } = require('child_process');
const path = require('path');
const net = require('net');

// 配置
const PORT = 3000;
const numCPUs = os.cpus().length;

// 存储工作进程
const workers = [];

// 轮询计数器
let currentWorker = 0;
let activeConnections = 0;

// 创建TCP服务器而非HTTP服务器
const server = net.createServer({ pauseOnConnect: true });

console.log(`主进程 ${process.pid} 启动`);
console.log(`CPU核心数: ${numCPUs}`);
console.log(`使用调度策略: Round-Robin (SCHED_RR)`);

// 初始化系统
function init() {
  // 创建工作进程
  forkWorkers();
  
  // 设置连接监听
  server.on('connection', (socket) => {
    activeConnections++;
    console.log(`主进程: 收到新连接，当前活跃连接: ${activeConnections}`);
    
    // 保持连接
    socket.setKeepAlive(true);
    
    // 暂停读取数据
    socket.pause();
    
    // 轮询选择工作进程
    const worker = workers[currentWorker];
    currentWorker = (currentWorker + 1) % workers.length;
    
    // 将连接传递给工作进程
    worker.send('connection', socket);
    console.log(`主进程: 将连接分发给工作进程 ${worker.pid}`);
    
    // 监听socket关闭
    socket.on('close', () => {
      activeConnections--;
      console.log(`主进程: 连接关闭，剩余活跃连接: ${activeConnections}`);
    });
  });
  
  // 开始监听
  server.listen(PORT, () => {
    console.log(`主服务器在端口 ${PORT} 上监听`);
  });
}

// 创建工作进程
function forkWorkers() {
  for (let i = 0; i < numCPUs; i++) {
    createWorker();
  }
  
  console.log(`已创建 ${workers.length} 个工作进程`);
}

// 创建单个工作进程
function createWorker() {
  const worker = fork(path.join(__dirname, 'worker-b.js'));
  workers.push(worker);
  
  // 监听工作进程消息
  worker.on('message', (message) => {
    if (message.type === 'ready') {
      console.log(`工作进程 ${worker.pid} 准备就绪`);
    } else if (message.type === 'request_completed') {
      console.log(`主进程: 工作进程 ${worker.pid} 完成请求处理: ${message.data.url}`);
    } else if (message.type === 'error') {
      console.error(`主进程: 工作进程 ${worker.pid} 报告错误:`, message.data.message);
    } else {
      console.log(`来自工作进程 ${worker.pid} 的消息:`, message);
    }
  });
  
  // 监听工作进程退出
  worker.on('exit', (code, signal) => {
    console.log(`工作进程 ${worker.pid} 退出，代码: ${code}, 信号: ${signal}`);
    
    // 从列表中移除
    const index = workers.indexOf(worker);
    if (index !== -1) {
      workers.splice(index, 1);
    }
    
    // 创建新工作进程
    createWorker();
  });
  
  return worker;
}

// 处理主进程信号
process.on('SIGINT', () => {
  console.log('正在关闭服务器...');
  server.close(() => {
    console.log('服务器已关闭。');
    workers.forEach(worker => worker.kill());
    process.exit(0);
  });
});

// 处理未捕获异常
process.on('uncaughtException', (err) => {
  console.error('主进程发生未捕获的异常:', err);
});

// 启动系统
init();